package com.client.service;

import com.client.window.ChatWindow;
import com.client.window.MainWindow;

import javax.swing.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;

/**
 * @Author e4glet
 * 2025年3月5日
 * 处理服务器端消息处理模块
 * */

public class ServerHandler implements Runnable{
    private OICQClient client;
    private MainWindow mainWindow;
    private volatile boolean running = true;

    // 通过构造器传递客户端模块
    public ServerHandler(OICQClient client, MainWindow mainWindow) {
        this.client = client;
        this.mainWindow = mainWindow;
    }

    @Override
    public void run() {
        System.out.println("客户端线程启动");
        //第一次更新好友列表
        handleFriendListUpdate();
        try {
            while (running) {
                String message = client.reader.readLine();
                if (message == null) break; // 如果为空说明服务器没有传递任何消息，中止即可
                handleServerMessage(message);
            }
        } catch (IOException e) {
            if (running) {
                e.printStackTrace();
                JOptionPane.showMessageDialog(null, "与服务器的连接已断开");
                System.exit(1);
            }
        }
    }

    private void handleServerMessage(OICQClient client) throws IOException {
        //登录成功后进入主窗口刷新好友列表
        handleFriendListUpdate();

        System.out.println("执行handleServerMessage");

        System.out.println("收到原始消息: " + client.reader.readLine()); // 添加调试日志
    }

    /**
     * 处理收到的服务器端指令
     * 根据指令处理不同的消息类型
     * */
    private void handleServerMessage(String message) {
        System.out.println("收到原始消息: " + message); // 添加调试日志
        // 提取消息前缀，
        // 好友列表消息格式：FRIEND_LIST 2,eaglet,0;3,ming,0;
        // 私聊信息消息格式：MESSAGE_SENT_PRIVATE 3,1,11112
        String[] parts = message.split(" ");
        String command = parts[0];

        switch (command) {
            case "FRIEND_LIST":
                handleFriendListUpdate();
                break;
            case "MESSAGE_RECEIVER_PRIVATE":
                handlePrivateMessage(message);
                break;
            case "ANNOUNCEMENT":
                handleAnnouncement(message);
                break;
            case "SYSTEM_MSG":
                handleSystemMessage(message);
                break;
            case "UPDATE_FRIEND_LIST_STATUS":
                handleRefreshFriendList();
                break;
            default:
                break;
        }
    }

    //更新好友列表
    private void handleFriendListUpdate() {
//        SwingUtilities.invokeLater(() -> {
//            mainWindow.updateFriendListFromServer();
//        });
        System.out.println("客户端日志请求更新好友列表");
        mainWindow.updateFriendListFromServer();
    }

    /**
     * 刷新好友列表
     * */
    private void handleRefreshFriendList(){
        System.out.println("客户端调试日志：收到服务器通知，刷新好友列表！");
        handleFriendListUpdate();
    }

    /**
     * 收到服务器转发的私聊消息，显示在指定用户
     * */
    private void handlePrivateMessage(String message) {
        // 消息格式: MESSAGE_RECEIVER_PRIVATE 接收者ID,发送者ID,消息内容
        String[] parts = message.split(" ");
        String[] data = parts[1].split(",");
        int receiverId = Integer.parseInt(data[0]);
        int senderId = Integer.parseInt(data[1]);
        String content = data[2];
        SwingUtilities.invokeLater(() -> {
            // 检查聊天窗口是否已打开
            if (mainWindow.isChatWindowOpen(senderId)) {
                // 直接显示消息到窗口
                ChatWindow chatWindow = mainWindow.getChatWindow(senderId);
                chatWindow.receiveMessage(content);
            } else {
                // 更新未读计数和最新消息
                mainWindow.incrementUnreadCount(senderId);
                mainWindow.setLatestMessage(senderId, content);
            }
        });
    }

    private void handleAnnouncement(String message) {
        System.out.println(message);
    }

    private void handleSystemMessage(String message) {
        System.out.println(message);
    }



    //停止方法
    public void stop() {
        running = false;
    }
}
